using GamFi.Admin.API.Application.Exceptions;
using GamFi.Admin.API.Application.Interfaces;
using GamFi.Admin.API.Application.Resources;
using MediatR;
using Microsoft.Extensions.Localization;

namespace GamFi.Admin.API.Application.Features.Queries.Country.AddCountry;

/// <summary>
/// Обработчик команды на добавление новой страны.
/// </summary>
public class AddCountryCommandHandler : IRequestHandler<AddCountryCommand, Unit>
{
    private readonly IDbContext _dbContext;
    private readonly IStringLocalizer<ExceptionMessages> _localizer;

    /// <summary>
    /// Конструктор обработчика команды на добавление новой страны.
    /// </summary>
    /// <param name="context"></param>
    /// <param name="localizer"></param>
    public AddCountryCommandHandler(IDbContext context, IStringLocalizer<ExceptionMessages> localizer)
    {
        _dbContext = context;
        _localizer = localizer;
    }

    /// <summary>
    /// Обработка команды на добавление новой страны.
    /// </summary>
    /// <param name="request">Команда на добавление новой страны.</param>
    /// <param name="cancellationToken">Токен для отмены операции.</param>
    /// <returns>Результат выполнения команды.</returns>
    public async Task<Unit> Handle(AddCountryCommand request, CancellationToken cancellationToken)
    {
        if (request is null)
            throw new RequestException(_localizer[nameof(RequestException.RequestIsEmpty)]);
        
        var newCountry = new Domain.Entities.Country
        {
            Name = request.Name,
            Code = request.Code,
            AlphaTwo = request.AlphaTwo,
            AlphaThree = request.AlphaThree,
        };

        // Добавление новой страны в контекст базы данных
        _dbContext.Countries.Add(newCountry);

        // Сохранение изменений в базе данных
        await _dbContext.SaveChangesAsync(cancellationToken);

        return Unit.Value;
    }
}